package cn.itcast.web.controller;


import cn.itcast.common.utils.Encrypt;
import cn.itcast.domain.system.Module;
import cn.itcast.domain.system.User;
import cn.itcast.service.system.ModuleService;
import cn.itcast.service.system.UserService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.List;

@Controller
public class LoginController extends BaseController{

	@Autowired
	private UserService userService;

	@Autowired
	private ModuleService moduleService;


	/**
	 * 基于shiro的用户登录
	 */
	@RequestMapping("/login")
	public String login(String email,String password) {
		//1.判断邮箱和密码是否为null,如果为null重新登录
		if(StringUtils.isEmpty(email) || StringUtils.isEmpty(password)) {
			return "forward:/login.jsp";
		}
		try {
			//2.获取工具类subject
			Subject subject = SecurityUtils.getSubject();
			//3.调用subject的login方法，通过shiro登录
			UsernamePasswordToken upToken = new UsernamePasswordToken(email,password); //用户名和密码的封装对象
			subject.login(upToken);
			//4.正常执行，shiro正常执行认证流程，shiro会将用户对象自动的保存到shiro的内存中
			//用户对象
			User loginUser = (User)subject.getPrincipal() ;//获取安全数据（用户对象）
			session.setAttribute("loginUser",loginUser);
			//可操作的所有模块
			List<Module> list = moduleService.findByUserId(loginUser.getId());
			session.setAttribute("modules",list);
			return "home/main";
		}catch (Exception e) {
			//5.抛出异常
			e.printStackTrace();
			request.setAttribute("error","用户名或者密码错误");
			return "forward:/login.jsp";
		}
	}

	/**
	 * 用户登录
	 *      参数：邮箱和密码
	 */
//	@RequestMapping("/login")
//	public String login(String email,String password) {
//		//1.判断邮箱和密码是否为null,如果为null重新登录
//		if(StringUtils.isEmpty(email) || StringUtils.isEmpty(password)) {
//			return "forward:/login.jsp";
//		}
//		//2.根据邮箱通过service查询用户
//		User loginUser = userService.findByEmail(email);
//		//对用户输入的登录密码，加密，加密完成之后再和数据库中的密码比较
//		//用户登录的密码111111   数据库密码32位字符串
//		password = Encrypt.md5(password,email);
//
//		//3.判断用户是否为空，或者密码是否匹配
//		if(loginUser == null || !loginUser.getPassword().equals(password)){
//			//3.1 用户不存在或者密码不比配，跳转到登录页面重新登录
//			request.setAttribute("error","用户名或者密码错误");
//			return "forward:/login.jsp";
//		}else{
//			//3.2 用户存在密码一致，将用户数据保存到session，跳转到主页
//			session.setAttribute("loginUser",loginUser);
//
//			//4.用户登录成功之后，查询可操作的菜单模块数据
//			List<Module> list = moduleService.findByUserId(loginUser.getId());   //参数可以是userId，也可以是登录的用户对象
//			session.setAttribute("modules",list);
//
//			return "home/main";
//		}
//	}

    //退出
    @RequestMapping(value = "/logout",name="用户登出")
    public String logout(){
        //清空shiro中的内存数据，调用shiro的方法登出
	    SecurityUtils.getSubject().logout();
        return "forward:login.jsp";
    }

    @RequestMapping("/home")
    public String home(){
	    return "home/home";
    }
}
